//变量提升 hoist
//1
console.log(name);
var name = 'hoist name';

//2.--相当于在这里定义了foo,但没有值
function bar() {
    if(!foo) foo = 10;
    console.log('hoist 找到函数外面定义的foo：' + foo);
}
bar();
var foo = 1;

//3.注意内部var覆盖了外部var
var foo3 = 1;
function bar3() {
	if(!foo3) var foo3 = 10;
	console.log('注意内部var覆盖了外部var,内部var提升到函数作用域顶部: ' + foo3);
}
bar3();

//函数提升
//1.函数声明会提升
fn();
function fn() {
	console.log('函数声明会提升: 函数先使用后使用function定义');
}

//2.注意函数表达的坑，可以这样理解：变量提升了，但不知道这个变量赋了什么值
try{
	fn2();
	var fn2 = function() {
	}
}catch(e) {
	console.error('------');
	console.error(e);
	console.log('函数表达式的fn2，先调用后声明，这里会出错');
	console.error('------');
}

//3.函数优先。如果同时存在函数声明与函数表达式，函数声明会优先。
fn3();
var fn3 = function() {
	console.log('函数表达式fn3');
}
function fn3() {
	console.log('函数声明fn3');
}
//注意：函数表达式的赋值操作还在原来的位置，var 声明会提升；而函数声明也会提升，但优先级最高
fn3();

//再加这个例子，加深理解hoist
var f = function () {
     console.log('1');
}

function f() {
     console.log('2');
}

f(); // 1
